/*********************************************************************************
 * COPYRIGHT NOTICE
 * Copyright (c) 2017-2018, XinJiang University. All right reserved
 *
 * 文件名		:	Sys_IO.c
 * 描述 		:	基本输入输出
 *
 * 版本			:	V3.3.4
 * 作者			:	王志浩
 * 日期			:	2017-10-22
 * 
 * 以下全部程序之著作权归属新疆大学所有，软件著作权登记编号2018R11L423999
 * 未经著作权所有人书面授权，任何单位和个人不得将以下程序用于商业盈利用途！
 * 修改此程序请保留上述版权声明，引用程序请注明出处！
**********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm8l10x.h"
#include "main.h"

unsigned char 	BeepCounterFlag = 0;								//蜂鸣器工作标志位
EC11_State_s		ec11_state = {KEY_FREE,CODER_FREE};	//编码器状态结构体，具体含义见头文件

/************************************************************
 * 函数名		:	Beep
 * 功能说明	:	调用此函数打开蜂鸣器，并打开定时器0，由定时器0来调整蜂鸣器响的占空比进而调整音量，
 *						避免延时函数对主程序影响
 *
 * 输入参数	:	beep蜂鸣器时间
 * 输出参数	:	无
 *
 * 修改记录	:	新增函数，第一次编辑
 * 历次作者	:	王志浩
 * 日期			:	2017-10-18
*************************************************************/	
void Beep(unsigned int beep)
{
	if(beep>0 && beep<11)
	{
		BeepCounterFlag = 1;
	}
	else
	{
		BeepCounterFlag = 0;
	}
}

/************************************************************
 * 函数名		:	EC11_Capture
 * 功能说明	:	捕捉EC11按下和旋转信息
 *
 * 输入参数	:	无
 * 输出参数	:	无
 *
 * 修改记录	:	新增函数，第一次编辑
 * 历次作者	:	王志浩
 * 日期			:	2017-10-18
*************************************************************/	
void EC11_Capture(void)
{
	static unsigned char Aold = 0,Bold = 0;
	static unsigned char RotatingFlag = 0;
	static unsigned int KeyDown_Counter = 0,KeyDown_Counter_Old = 0;
	
	//如果同时为高电平，说明转了
	if(EC11_A && EC11_B)
	{
		RotatingFlag = 1;
	}
	//如果转了之后
	if(RotatingFlag)
	{
		//同时为低电平，判断上次的值，即可得出转的方向
		if(!EC11_A && !EC11_B)
		{
			if(Aold)
			{
				RotatingFlag = 0;
				IronUse_Status.Coder = USING;
				if(!FAC_DATA_Table.Adjust_s.Encoder)
				{
					Beep(MENU_DATA_Table.Other_s.Beep_Volume);
					ec11_state.Coder = CODER_SUB;
				}
				else
				{
					Beep(MENU_DATA_Table.Other_s.Beep_Volume);
					ec11_state.Coder = CODER_ADD;
				}
			}
			if(Bold)
			{
				RotatingFlag = 0;
				IronUse_Status.Coder = USING;
				if(!FAC_DATA_Table.Adjust_s.Encoder)
				{
					Beep(MENU_DATA_Table.Other_s.Beep_Volume);
					ec11_state.Coder = CODER_ADD;
				}
				else
				{
					Beep(MENU_DATA_Table.Other_s.Beep_Volume);
					ec11_state.Coder = CODER_SUB;
				}
			}
		}
	}

	//保存上次的值
	Aold = EC11_A;
	Bold = EC11_B;
	
	//记录按键按下时间
	if(!EC11_KEY)
	{
		KeyDown_Counter++;
		if(KeyDown_Counter==KEYHOLD_TIME_CODER)
		{
			Beep(MENU_DATA_Table.Other_s.Beep_Volume);//长摁时间到
			//BEEP_ON;
		}
	}
	else
	{
		KeyDown_Counter_Old = KeyDown_Counter;
		KeyDown_Counter = 0;
	}

	//根据按下时间判断长按短按
	if((KeyDown_Counter_Old < KEYHOLD_TIME_CODER) && (KeyDown_Counter_Old > KEYDOWN_TIME_CODER))
	{
		Beep(MENU_DATA_Table.Other_s.Beep_Volume);
		ec11_state.Key = KEY_DOWN;
		IronUse_Status.Coder = USING;
	}
	else if(KeyDown_Counter_Old >= KEYHOLD_TIME_CODER)
	{
		//Beep(MENU_DATA_Table.Other_s.Beep_Volume);
		ec11_state.Key = KEY_HOLD;
		IronUse_Status.Coder = USING;
		KeyDown_Counter_Old = 0;
	}

}

/************************************************************
 * 函数名		:	Key_Scan
 * 功能说明	:	扩展按键
 *
 * 输入参数	:	无
 * 输出参数	:	无
 *
 * 修改记录	:	新增函数，第一次编辑
 * 历次作者	:	王志浩
 * 日期			:	2017-10-18
*************************************************************/	
void Key_Scan(void)
{
	static unsigned char KeyADown_Counter = 0,			KeyBDown_Counter = 0,			KeyCDown_Counter = 0;
	static unsigned char KeyADown_Counter_Old = 0,	KeyBDown_Counter_Old = 0,	KeyCDown_Counter_Old = 0;
	//记录按键A按下时间
	if(!KEY_A)
	{
		_nop_();
		if(!KEY_A)
		{
			KeyADown_Counter++;
		}
	}
	else
	{
		KeyADown_Counter_Old = KeyADown_Counter;
		KeyADown_Counter = 0;
	}
	//记录按键B按下时间
	if(!KEY_B)
	{
		_nop_();
		if(!KEY_B)
		{
			KeyBDown_Counter++;
		}
	}
	else
	{
		KeyBDown_Counter_Old = KeyBDown_Counter;
		KeyBDown_Counter = 0;
	}	//记录按键C按下时间
	if(!KEY_C)
	{
			_nop_();
		if(!KEY_C)
		{
			KeyCDown_Counter++;
		}
	}
	else
	{
		KeyCDown_Counter_Old = KeyCDown_Counter;
		KeyCDown_Counter = 0;
	}
	//A键短按
	if((KeyADown_Counter_Old < KEYHOLD_TIME) && (KeyADown_Counter_Old > KEYDOWN_TIME))
	{
		Beep(MENU_DATA_Table.Other_s.Beep_Volume);
		MENU_DATA_Table.Other_s.Heater_Tip ++;
		//这个1和4决定了从1到4循环，如果需要12循环或其他的，自己改就行了
		if(MENU_DATA_Table.Other_s.Heater_Tip>4)
		{
			MENU_DATA_Table.Other_s.Heater_Tip = 1;
		}
		//存储
		EEPROM_SectorErase(0x0);
		EEPROM_write_n(0x0,(unsigned char *)&MENU_DATA_Table,sizeof(MENU_DATA_Table));
	}
	//A键长按
	else if(KeyBDown_Counter_Old >= KEYHOLD_TIME)
	{
	}
	//B键短按
	if((KeyBDown_Counter_Old < KEYHOLD_TIME) && (KeyBDown_Counter_Old > KEYDOWN_TIME))
	{
		IronStateFlag = SLEEPING;
		Beep(MENU_DATA_Table.Other_s.Beep_Volume);
		//清计时器为待机做准备
		Timer.Min = 0;
		Timer.Sec = 0;
	}
	//B键长按(单片机自杀)
	else if(KeyBDown_Counter_Old >= KEYHOLD_TIME)
	{
		Beep(MENU_DATA_Table.Other_s.Beep_Volume);
		SHUTDOWN = 0;
	}
	//C键短按
	if((KeyCDown_Counter_Old < KEYHOLD_TIME) && (KeyCDown_Counter_Old > KEYDOWN_TIME))
	{
	}
	//C键长按
	else if(KeyCDown_Counter_Old >= KEYHOLD_TIME)
	{
	}
}